Введение в анализ данных

Домашнее задание 3. Оценки параметров и сбор данных.

Выполнил: Евдокимов Егор

Cсылка на drive со всем файлами.

Правила, прочитайте внимательно:

Баллы за задание:

Легкая часть (достаточно на "хор"):

Сложная часть (необходимо на "отл"):

Легкая часть

Задача 1.

a). Пусть $X_1,...,X_n$ выборка из некоторого распределения $\mathsf{P}$, причем ${\sf D} X_1=\sigma^2<+\infty$, и $\sigma$ неизвестно. Рассмотрим оценку $S^2 = \overline{X^2}-\overline{X}^2$ дисперсии $\sigma^2$.

Докажите, что $S^2=\frac1n\sum\limits_{i=1}^n\left(X_i-\overline{X}\right)^2$.

Доказательство: Согласно определению $S^2 = \frac{1}{n} \sum\limits_{i=1}^n X_i^2 - (\frac{1}{n} \sum\limits_{i=1}^n X_i)^2 = \frac{1}{n} (\sum\limits_{i=1}^{n}X_i^2 - 2(\sum\limits_{i=1}^{n}X_i)(\frac{1}{n} \sum\limits_{i=1}^{n}X_i) + n(\frac{1}{n}\sum\limits_{i=1}^n X_i)^{2}) = \frac{1}{n}((\sum\limits_{i=1}^n X_i^2) - 2\overline{X}(\sum\limits_{i=1}^n X_i) + n(\overline{X})^{2}) = \frac{1}{n}(\sum\limits_{i=1}^n X_i^2 -2 \overline{X}\sum\limits_{i=1}^n X_{i} + \sum\limits_{i=1}^n \overline{X}^{2})$ Получаем, что $S^2=\frac1n\sum\limits_{i=1}^n\left(X_i-\overline{X}\right)^2$

b). Оценка $\widehat{\theta}$ называется несмещенной оценкой параметра $\theta$ если для любого $\theta \in \Theta$ выполнено $\mathsf{E}_\theta \widehat{\theta} = \theta$. Иначе говоря, какое бы ни оказалось истинное значение параметра $\theta$ рассматривая оценку $\widehat{\theta}$ в среднем будем получать именно $\theta$.

Является ли статистика $S^2$ несмещенной оценкой $\sigma^2$?

Подсказка. Посчитайте математическое ожидание случайной величины $S^2$. Используйте для этого известные вам свойства математического ожидания.

Доказательство: Так как $X_1, ... X_n$ одинаково распределены, то $\forall i \mathsf E X_i = \mathsf E X_1$. А так как они независимы $\mathsf E(X_i X_j) = \mathsf E X_i \cdot \mathsf E X_j$. Пользуясь линейностью матожидания

$\mathsf ES^{2} = \frac{1}{n}\sum\limits_{i=1}^n \mathsf EX_i^2 - \mathsf E(\frac{1}{n}\sum\limits_{i=1}^n X_{i})^{2} = \mathsf E X^{2}_{1} - \frac{1}{n^2}(\sum\limits_{i=1}^n \mathsf EX_i^2 + 2\sum\limits_{1 \leq i < j \leq n}^n \mathsf E(X_{i}X_{j}))= \mathsf E X^{2}_{1} - \frac{1}{n^2}(\sum\limits_{i=1}^n \mathsf EX_i^2 + 2\sum\limits_{1 \leq i < j \leq n}^n \mathsf E(X_{i}) \mathsf E (X_{j})) = \mathsf E X^{2}_{1} - \frac{1}{n^{2}}(n \mathsf EX_1^2 + 2\frac{n(n-1)}{2} \mathsf (E X_1)^2) = (\frac{n - 1}{n})(\mathsf EX_1^2 - (\mathsf EX_1)^{2}) = (\frac{n - 1}{n})\sf DX_1.$ В итоге статистика $S^2$ не является несмещенной оценкой $\sigma^2$.


Задача 2.

Пусть $X_1, ..., X_n$ — выборка из распределения $\mathcal{N}(0, \sigma^2)$. В качестве оценок $\sigma^2$ обычно используют $S^2$ или $\frac{n}{n-1}S^2$. Что можно сказать про их несмещенность?

Ответ: Оценка $S^2$, то есть просто выборочная дисперсия, является смещенной оценкой для теоретической. А исправленная, то есть $\frac{n}{n-1} S^2$ является несмещенной. Так как теоритическая дисперсия для нормального распределения это как раз $\sigma^2$ и по предыдущему пункту $\mathsf E\frac{n}{n-1}S^{2} = {\sf D} X_1 = \sigma^2$, а это соответствует определению несмещенной оценки. Тогда $S^2$ является смещенной оценкой, так как $\mathsf E S^{2} \neq \sigma^2$.

1. Теперь проверьте это на практике. Для каждой из приведенных выше оценок $\widehat{\theta}$ выполните следующие действия.

Используйте приведенный ниже шаблон для визуализации значений.

Внимание! Следите за информативностью и наглядностью графиков. Например, пустых пространств должно быть как можно меньше, ничего не должно быть скомкано, вся нужная информация должна быть представлена. Посмотрите также презентацию с разбора задания 1. Если график чему-то не удовлетворяет, оценка может быть снижена.

Вместо использования matplotlib можно также строить графики с помощью plotly.

Решение:

Вывод: На всех трех графиках с разными размерами выборок видно, что несмещенная оценка всегда ближе к истинному значению $\sigma$, чем смещенная. Зеленая звездочка всегда получается ближе к 1. Также заметно, что при увеличении $n$ разброс $\theta$ уменьшается, да и $\overline{\theta}$ все точнее.

2. Изучим поведение среднего оценок из первого пункта при росте размера выборки. Постройте график зависимости $\overline{\theta}$ от $n$ для двух типов оценок. Для вычисления зависимости нужно один раз сгенерировать выборки из пункта 1 достаточно большого размера (не более 500) и посчитать оценки по подвыборкам, используя функции из numpy. Использовать циклы, а так же функции, разворачивающиеся в цикл (например, np.vectorize), запрещено. Какие из оценок являются асимптотически несмещёнными, т.е. $\forall \theta \in \Theta\colon \mathsf{E}_\theta \widehat{\theta} \to \theta$ при $n\to +\infty$?

Решение:

Сделайте вывод о том, что такое свойство несмещенности. Подтверждают ли сделанные эксперименты полученное в теоретических задачах свойство несмещенности (или отсутствие этого свойства) данных оценок? Поясните, почему в лабораторных по физике при оценке погрешности иногда используют $n-1$ в знаменателе, а не $n$.

Вывод: Видно, что при достаточно больших $n$ оценки очень близки. $\overline{\theta}$ совсем не колеблется в обоих случаях. Опираясь на лабораторные работы по физике можно сказать, что несмещенность оценки говорит об отсутствии систематической ошибки. А свойство состоятельности обеспечиввает близость оценки и величины при увеличении числа измерений. Видно, что при увеличении числа измерений обе оценки прибоижаются к реальному значению $\sigma^2$ они являются состоятельными, но несмещенная оценка делает это быстрее. Поэтому в лабах, где нет возможности проводить эксперимент бесконечность раз, используют несмещенную оценку, дабы получить лучше результат. Собственно, поэтому часто используется $n-1$ в знаменателе.

Замечание. Проведенные эксперименты позволяют сделать вывод только о поведении среднего значения оценки, но ничего не говорят о том, насколько велик их разброс относительно среднего.


Задача 3.

В этой задаче вам нужно будет проанализировать вакансии на сайте hh.ru. Для сбора данных рекомендуется использовать официальное API.

a47371.buy12r.1ets.rs.ii.jpg

1. Сбор данных

Соберите данные о вакансии Data Scientist по Москве в одну таблицу и подготовьте их для анализа. Часто в индустрии подготовленные для анализа таблицы называют витринами. В ней должны быть:

Креативность приветствуется. При работе с данными о заработной плате обратите внимание на валюту и gross/net.

При работе с API не забывайте делать паузы между запросами, чтобы не задудосить сервер HeadHunter.

Пример запроса к API:

Всппоминаем, какие столбцы нам нужны.

Конкретно в это месте стоит сказать, что анализировать 300 вакансий не очень разумно, поэтому было решено скачать больше, связанных так или иначе наукой о данных. Data Engineer и Data Analyst.

Пришло время слить все воедино. Название dataset_ds_all останется.

2. Анализ и визуализация данных

Проведите исследование получившихся данных. Прежде всего убедитесь, что ваши данные чистые. Убедитесь, что вы проделали следующее:

Среди вакансий можно выделять группы. Например, бизнес-аналитик, BI аналитик, продуктовый аналитик.

Ответьте не следующие вопросы:

Не забудьте про визуализацию — для этого используйте библиотеку plotly. Постройте следующие графики:

Для построения последних двух графиков вам могут понадобиться внешние данные.

Предобработка:

Видно, что основная проблема с пропусками в информации о зарплате. Насколько можно судить по данным, почти везде составители описаний вакансий указывают неполную вилку(либо верхнюю, либо нижнюю границы). Вместо пустой зарплаты указывать какое-то число - значит, сместить оценку, а если обрабатывать только полные данные, получим слишком маленькую выборку.Поэтому придется оставить так.

Часто не указывают валюту(будем считать, что там рубли).

Если не указывают до вычета налогов или нет, будем считать, что до вычета.

Пустую колонку salary просто дропнем.

В итоге мы имеем ситуацию, когда много вакансий содержит слово data scientist, также выделяются data engineer, data analyst. Часто встречаются qa engineer, big data, ml engineer. Они и будут самыми популярными.

Гораздо легче, чем с названиями вакансий, где английский и русский языки перемешиваются. В большинстве вакансий требуется знание python, требуется владение sql. Далее linux, владение английским, математическими дисциплинами, data mining, git, java, postgresql, docker и тд.

Чаще всего требуется опыт работы от 1 до 3 лет и от 3 до 6 лет.

Видно, что Сбербанк в топе, почти десятая часть вакансий его. У следующей компании Т1 Интеграция ваканстй в 3 раза меньше.

Кажется, сравнивать работодателей по максимальной зарплате трудно, так как очень многие просто ее не указывают, а те, которые указывают, обычно имеют по 1 вакансии, что недостаточно для понимания среднего. Однако в топе Behavox, IT_Selection, Coins.ph, Hunt For You.

Видим, что большая часть вакансий находится в Тверском, Замоскворечье и Пресненском, Далиловском районах. В районах Зюзино, Кунцево, Левобережный, Отрадное районах по 1 вакансии.

На гистограммах хорошо видно, что есть какое-то среднее значение, а по бокам распределение спадает. Есть несколько выбросов с большими зарплатами.

Проблема в том, что очень много вакансий содержит слово data scientist, однако все равно видны некоторые закономерности, у devops ценится работа на linux, навыки работы с git linux у python developer, аналитику нужны математические дисциплины. У data engineer нужен oracle, базы данных, product manager должен знать анлийский. QA automation engineer должен владеть java и тд, легче посмотреть самостоятельно.

Ух ты, тут компании из Питера и Минска, нужно их дропнуть.

Все вакансии попадают КАД, так и должно быть. На первый взгляд распределены достаточно равномерно, посмотрим чуть позже на график плотности на карте.

Вот тут уже интереснее, пятна в центре гораздо горяее, значит вакансии, которые ближе к центру, в среднем предлагают выше зарплату, достаточно закономерно, они крупнее и имеют деньги на аренду офисов в центре для удобства сотрудников и платят, соответственно, больше.

Видны точки с большей плотностью у Москва-Сити, офисов Сбера, на Тверской. На окраинах плотность меньше, чем в центре.

Сразу замечаем, что английский язык, c++, java, знание scala и сильно поднимают зарплату. А также hadoop, spark, javascript.

3. Анализ профессии, о которой вы мечтали в детстве

Проведите аналогичное исследование для профессии, о которой вы мечтали в детстве. Это может быть повар, учитель, пожарный и т.д. — все зависит от вас ☺.

Всегда была интересна профессия продуктового менеджера, думаю, и достаточное число вакансий на нее найдется.

Видно, что основная проблема с пропусками в информации о зарплате. Насколько можно судить по данным, почти везде составители описаний вакансий указывают неполную вилку(либо верхнюю, либо нижнюю границы). Вместо пустой зарплаты указывать какое-то число - значит, сместить оценку, а если обрабатывать только полные данные, получим слишком маленькую выборку.Поэтому придется оставить так.

Часто не указывают валюту(будем считать, что там рубли).

Если не указывают до вычета налогов или нет, будем считать, что до вычета.

Пустую колонку salary просто дропнем.

Выделяются группы product manager, product owner, бренд менеджер, категорийный менеджер. Бывают еще менеджеры по закупкам, бренд менеджеры,qa engineer, бизнес аналитик и тд.

Гораздо легче, чем с названиями вакансий. Чаще всего требуется знание английского, далее требуется опыт управления продуктом, владение powerpoint. Далее владение agile, sql, scrum.

Чаще всего требуется опыт работы от 1 до 3 лет и от 3 до 6 лет.

Видно, что Ozon в топе.Следующие компании LATOKEN, МТС, Сбербанк. В основном в компаниях требуется мало продукт манагеров, это и логично, управленцев не должно быть много.

Цифры говорят сами за себя :). Средняя зарплата у Behavox, BookedBy, Fivetran выше, чем у остальных. Примечательно, что в первом рейтинге они ведут себя примерно также. И все же вспоминаем, сколько пропусков было в зарплатах, это далеко не точный анализ.

Также в глаза бросается Кадровое агентство Алексея Сухорукова.

Видим, что большая часть вакансий находится в Пресненском, Замоскворечье и Тверском районах. В отдаленных районах Кузьминки, Коньково и так далее опять по 1 вакансии. В Пресненском районе почти в два раза больше, чем у следущего по количеству района.

Проблема в том, что очень много вакансий содержит слово product manager, однако все равно видны некоторые закономерности, в product marketing manager ценится маркетинговый анализ и маркетинговые исследования(удивительно!), у ux manager требуется знание ux, также как и у product designer. Все вполне закономерно. Очень много требований у product owner.

Здесь аналогичная ситуация, те, что ближе к центру горячее. Опять выделяется Москва-Сити.

Сильно выделяется район Москва-Сити, видимо, там сидит много продукт менеджеров.

Вау! График очень даже информативный. Вижно, что ux ценится очень высоко. Также знание бизнес анализа, опят запусков продуктов и развитие продаж выделяются.

Замечание в тему. Многие из вас наверняка сейчас уже начинают задумываться о работе. Конечно, вы имеете на это полное право. Однако, по нашему опыту работа на 3 курсе отрицательно сказывается на степени усвоения материала. По сути все предметы цикла Data Science у вас еще впереди. Подумайте, наверное, лучше разобраться во всем во время учебы, чем потом что-то где-то нагонять. Более простой вариант — летняя стажировка, но не забудьте отдохнуть, набравшись сил перед непростым 3 курсом ☺.


Сложная часть

Задача 4.

Найдите оценку параметра $\theta$ методом моментов по выборке размера $n$ из распределения:

В каждом пункте пользуемся методом моментов:

1) Из курса теории вероятностей:

В случае равномерного распределения \begin{cases} \mathsf E_{\theta} X_1 = \frac{a+b}{2} = \overline{X} \\ \mathsf E_{\theta} X_1^2 = \frac{a^2+b^2+ab}{3} = \overline{X^2} \end{cases}

То есть

\begin{cases} a = 2\overline{X} - b \\ 4\overline{X}^2 - 4\overline{X} b + b^2 +b^2+2 \overline{X} b - b^2 = 3 \overline{X^2} \end{cases}\begin{cases} a = 2\overline{X} - b \\ 4\overline{X}^2 - 2\overline{X} b + b^2 - 3 \overline{X^2} = 0 \end{cases}

Так как $S^2 = \overline{X^2} - \overline{X}^2$, и вспоминая, что $b > a$, решая квадаратное уравнение, получаем

\begin{cases} b = \overline{X} \pm \sqrt{\overline{X}^2-4\overline{X}^2 + 3\overline{X^2}} \\ a = \overline{X} \mp \sqrt{\overline{X}^2-4\overline{X}^2 + 3\overline{X^2}} \end{cases}\begin{cases} b = \overline{X} + \sqrt{3S^2} \\ a = \overline{X} - \sqrt{3S^2} \end{cases}

2) В случае пуассоновского распределения

$\mathsf E_{\theta} X_1 = \theta = \overline{X}$, это и будет ответом $\theta = \overline{X}$.


3) В случае нормального распределения. Так как $\sf D X = \sigma^2 = \mathsf E X^2 - (\mathsf E X)^2 = \mathsf E X^2 - a^2$ \begin{cases} \mathsf E_{\theta} X_1 = a = \overline{X} \\ \mathsf E_{\theta} X_1^2 = a^2 + \sigma^2 = \overline{X^2} \end{cases}

В итоге \begin{cases} a = \overline{X} \\ \sigma^2 = \overline{X^2} - \overline{X}^2 \end{cases}


Задача 5.

В данной задаче вам предстоит распарсить сайт, который вы выберите.

1. Каждая ссылка (URL) в интернете состоит из нескольких компонент:

url_parts.png

Одна и та же ссылка может иметь несколько форм и вести на ту же самую страницу. Во время обхода сайта это надо учитывать и сохранять один уникальный урл для каждой страницы. Процедура, приводящая урл к каноничному виду, называется нормализацией. Процедуры, которые применяются к урлу для нормализации, описаны, например, на Википедии.

Установите пакет url_normalize, в котором есть готовая функция для нормализации.

pip install url_normalize

Прочитайте, как именно функция url_normalize меняет ссылку, и приведите примеры $4$ урлов, которые нормализуются к одному и тому же. Примеры должны демонстрировать различные этапы процедуры нормализации. Одним из этих примеров может быть сам нормализованный урл.


Изучите код, в котором скачиваются страницы сайта simple.wikipedia.org с занятия про парсинг данных. Код, реализующий обход в ширину с фильтрацией и нормализацией урлов, приведён в виде функции.

Код обхода в ширину:

2. Выберите сайт, который вам интересен, а также некоторую категорию страниц в нём. Поймите, с какой страницы сайта надо начать обход, чтобы обходить сайты данной категории.

Пример: ищем статьи про Data Science на Википедии, начинаем со статьи Data Dcience.

Укажите, что выбрали: Сайт bbc.com, будем искать новости на политические темы.

Придумайте критерий, который по тексту из HTML-страницы будет определять, находится ли страница в определённой вами категории.

Пример: статья на Википедии про Data Science, если в ней есть слово "data" или термины из статистики, теории вероятностей и анализа данных.

Опишите критерий: Будет считать, что статься на политическую тему, если в ней встречаются слова по типу "president", "government", "election", "minister", "chef".

Начав с выбранной страницы, скачайте не менее $500$ страниц сайта. В качестве функции фильтрации возьмите функцию, которая отделяет страницы с выбранного сайта от других.

Cделайте таблицу со следующей информацией:

Для последнего пункта можете воспользоваться функцией поиска слов по заданным префиксам, рассмотренной на занятии.

Определите, какой процент скачанных страниц принадлежит выбранной категории?

C помощью гистограмм сравните визуально распределения количества слов в статьях из выбранной категории и во всех остальных. Для этих двух распределений вычислите средние, медианы и дисперсии. Средние и медианы отобразите на графиках с гистограммами. Сделайте выводы.

Видно, что в политиечских новостях в среднем больше слов, чем в других. Также по гистограмма видно, что у политических новостей не такого, что у большого процента новостей определенное число слов, у них более менее равномерное распределение, в отличие от других новостей.

Постройте boxplot-графики для того, чтобы сравнить эти 2 распределения. Какой способ сравнения кажется вам более удобным?

К слову, можно было не строить предыдущий график, на этом все видно гораздо лучше. Медиана количества слов в политических новостях повыше. Разброс примерно одинаковый.

3. При помощи plotly визуализируйте скачанные страницы сайта. В качестве значений по осям возьмите количество слов на странице и количество ссылок на ней. Цветом обозначьте принадлежность выбранной вами категории. При наведении курсора на точку, обозначающую страницу, должна появляться подсказка с названием этой страницы.

Ух ты, очень интересный график. Видно, что политические новости подразделяются на две группы, одна из которых ведет себя, как и остальные новости, количество ссылок в них колеблется у 100, а в другой она линейно растет от количества слов. Возможно, мы наткнулись на группу новостей, которые являются своеобразными итогами недели, где основной смысл -- собрать сссылки на новости за неделю, чтобы люди нашли для себя что-то важное.

4. Предложите функцию фильтрации web-страниц, которую нужно подать в load_web_pages, чтобы среди скачанных сайтов был больше процент страниц из выбранной вами категории.

Скачайте снова не менее $500$ страниц, но уже с новой функцией фильтрации. Добавьте следующую информацию к каждой странице:

Для замера времени можете воспользоваться функцией time из пакета time.

Постройте гистограмму и ядерную оценку плотности для времени скачивания страницы.

Я построил графики двумя способами только для сравнения. Распределение очень напоминает нормальное или быть может Коши.

Какими известными вам стандартными распределениями оно может быть приближено? Найдите оценку параметров этого распределения по методу моментов и отобразите на графике плотность с полученными значениями параметров.

Замечание. Результат сильно зависит от сайта, железа и прочих характеристик. По идее должно получится неплохое приближение чем-то из того, что вам известно. Но если ничего не получится, то просто оставьте и прокомментируйте ваши попытки разобраться.

Кажется, что это похоже на нормальное распределение с учетом того, что время загрузки не может быть меньше 0. Да что уж там, почти все в природе имеет нормальное распределение.

По выведенному в пункте 4 для $\mathcal{N}(a, \sigma^2)$ \begin{cases} a = \overline{X} \\ \sigma^2 = \overline{X^2} - \overline{X}^2 \end{cases}

Выглядит не очень убеждающе.

Выводы: Оказалось, что метод, выбранный для поиска политических новостей оказался непостоянным, при последней загрузке новостей он выдал меньший процент политических новостей, чем предыдущий, скорее всего это связано с ухудшением эпидемиалогической обстановки, из-за которой появилось все больше новостей о ковидн. Значит, можно было в первом пункте искать новости в разделе world, а во втором искать просто. Рассматривался вариант с проверкой заголовка на ключеввые слова, однако он сильно ухудшал производительность.

Была собрана информация о времени загрузки страниц. К сожалению, метод моментов дал не слишком хорошие результаты, однако вид гистограммы мне точно напоминает нормальное распределение.

Также была рассмотрена интересная зависимость количества ссылок на странице от количества слов, которую я проанализировал выше.